package com.JavaNet.chapter8_client_socket.pair;

import java.io.*;
import java.net.*;

/**
 * @author SwordFall
 * 1.TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据，通过三次握手方式建立连接，形成传输数据的通道，在连接中进行大量数据的传输，效率会稍低
 * 2.Java中基于TCP协议实现网络通信的类
 * 客户端的Socket类
 * 服务器端的ServerSocket类
 * <p>
 * 3.Socket通信的步骤
 * ①创建ServerSocket和Socket
 * ②打开连接到Socket的输入/输出流
 * ③按照协议对Socket进行读/写操作
 * ④关闭输入输出流,关闭Socket
 * 4.服务器端:
 * ①创建ServerSocket对象,绑定监听端口
 * ②通过accept()方法监听客户端请求
 * ③连接建立后,通过输入流读取客户端发送的请求信息
 * ④通过输出流向客户端发送乡音信息
 * ⑤关闭相关资源
 * <p>
 * 5.客户端:
 * ①创建Socket对象,指明需要连接的服务器的地址和端口号
 * ②连接建立后,通过输出流向服务器端发送请求信息
 * ③通过输入流获取服务器响应的信息
 * ④关闭响应资源
 * <p>
 * UDP编程:
 * UDP协议(用户数据报协议)是无连接的,不可靠的,无序的,速度快
 * 进行数据传输时,首先将要传输的数据定义成数据报(Datagram), 大小限制在64K,在数据报中指明数据索要达到的Socket(主机地址和端口号),
 * 然后再将数据报发送出去
 * DatagramPacket类:表示数据报包
 * DatagramSocket类:进行端到端通信的类
 * <p>
 * https://www.cnblogs.com/rocomp/p/4790340.html
 **/
public class SocketServerDemo {

    public static void main(String[] args) throws Exception {


        new SocketServerDemo().new Server().ServerTCP();
    }

    /**
     * 基于TCP协议的Socket通信,实现用户登录,服务端
     */
    private class Server {

        private void ServerTCP() throws Exception {
            System.out.println("sever running......");
            //1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
            ServerSocket serverSocket = new ServerSocket(10086);//1024-65535
            //2.调用accept()方法开始监听,等待客户端的连接
            Socket socket = serverSocket.accept();    // <----------------------------------------- 等待和监听
            //3.获取输入流,并读取客户端信息

            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String info;
            while ((info = br.readLine()) != null) {
                System.out.println("来自客户端的消息: ");
                System.out.println(info);
            }
            socket.shutdownInput();   //关闭输入流, 输出流没有关闭?


            //4.获取输出流,响应客户端的请求
            OutputStream os = socket.getOutputStream();

            //  OutputStreamWriter writer = new OutputStreamWriter(os);


            BufferedOutputStream bf = new BufferedOutputStream(os);
            bf.write("我是服务器, 欢迎访问!".getBytes());
            bf.flush();

            //5.关闭资源
            bf.close();
            os.close();
            br.close();
            socket.close();
            serverSocket.close();
        }
    }


}
